package visiopuce.service.document;

import java.awt.Desktop;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;

import visiopuce.ApplicationContexte;
import visiopuce.objets.Analyse;
import visiopuce.objets.Champ;
import visiopuce.objets.Personne;
import visiopuce.objets.Prelevement;
import visiopuce.objets.Utilisateur;
import visiopuce.service.AnalyseServiceImpl;
import visiopuce.service.PersonneServiceImpl;
import visiopuce.service.PrelevementServiceImpl;
import visiopuce.service.UtilisateurServiceImpl;
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;

public class EnvoiADN {

	public String createDocument(Prelevement p, int i) {
		String nomFichierout = "";
		try {
			InputStream in = new FileInputStream(new File(ApplicationContexte.REPERTOIRE_MODEL + "envoiADN.docx"));
			IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Velocity);

			Prelevement prelevement = PrelevementServiceImpl.getInstance().getPrelevementById(p.getIdPrelevement());
			Personne personne = PersonneServiceImpl.getInstance().getPersonneById(prelevement.getPersonne().getIdPersonne());

			String repResultat = "";
			if (Character.isDigit(prelevement.getNumeroPrelevement().charAt(1))) {
				repResultat = ApplicationContexte.REPERTOIRE_RESULTAT + "activité 20" + prelevement.getNumeroPrelevement().substring(1, 3) + "\\" + prelevement.getNumeroPrelevement().substring(0, 1) + "\\";
			} else {
				if (Character.isDigit(prelevement.getNumeroPrelevement().charAt(2))) {
					repResultat = ApplicationContexte.REPERTOIRE_RESULTAT + "activité 20" + prelevement.getNumeroPrelevement().substring(2, 4) + "\\" + prelevement.getNumeroPrelevement().substring(0, 2) + "\\";
				}
			}
			HashMap<String, String> champs = PrelevementServiceImpl.getInstance().getChampByIdObjet("Prel-" + prelevement.getIdPrelevement());

			SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
			SimpleDateFormat formatterUS = new SimpleDateFormat("yyyy-MM-dd");
			// 2) Create Java model context
			IContext context = report.createContext();
			context.put("personne", personne);

			if (prelevement.getSecteur().getLibelle().equals("Puce postnatale") || prelevement.getSecteur().getLibelle().equals("Puce foetopathologie")) {
				context.put("dateNaissance", "Date de naissance : " + formatter.format(personne.getDateNaissance()));
			} else {
				context.put("dateNaissance", "Date de naissance de la mère : " + formatter.format(personne.getDateNaissance()));
			}

			Champ ctypeADN = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tTypeADN", "Prel-" + prelevement.getIdPrelevement());
			boolean isPurif = true;
			if (ctypeADN != null) {
				if (ctypeADN.getValeur().equals("Extraction et Purification")) {
					isPurif = MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Attention", "Une extraction et une purification existent pour le dossier " + personne.getNom() + " " + personne.getPrenom()
							+ ", souhaitez-vous utiliser la purification pour faire la puce? (annuler = utiliser l'extraction, ok = utiliser la purification)");
				} else {
					isPurif = false;
				}
			}

			Champ dateExt = null;

			if (isPurif) {
				if (champs.containsKey("datePurification")) {

					SimpleDateFormat formater = null;
					if (champs.get("datePurification") != null) {
						if (champs.get("datePurification").split("-")[0].length() == 2) {
							formater = new SimpleDateFormat("dd-MM-yyyy");
						}
						if (champs.get("datePurification").split("-")[0].length() == 4) {
							formater = new SimpleDateFormat("yyyy-MM-dd");
						}

						Date dpurif;
						try {
							dpurif = formater.parse(champs.get("datePurification"));
							context.put("kit", "Kit de purification : DNA Clean and Concentrator-5, Zymo Research de chez Protéigène.");
							context.put("typePrel", "ADN purifié");
							context.put("dateExtraction", "Date de purification : " + formatter.format(dpurif));
							if (champs.containsKey("tConcentrationADNpurif") && champs.get("tConcentrationADNpurif") != null && !champs.get("tConcentrationADNpurif").equals("null")) {
								context.put("concentration", "Concentration d'ADN purifié : " + champs.get("tConcentrationADNpurif") + " ng/μL");
							}
							if (champs.containsKey("t260_230purif") && champs.get("t260_230purif") != null && !champs.get("t260_230purif").equals("null")) {
								context.put("r260230", champs.get("t260_230purif"));
							} else {
								context.put("r260230", "non renseigné");
							}

							if (champs.containsKey("t260_280purif") && champs.get("t260_280purif") != null && !champs.get("t260_280purif").equals("null")) {
								context.put("r260280", champs.get("t260_280purif"));
							} else {
								context.put("r260280", "non renseigné");
							}
						} catch (ParseException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}
			} else {
				if (context.get("concentration") == null) {
					if (champs.containsKey("tConcentrationADN") && champs.get("tConcentrationADN") != null && !champs.get("tConcentrationADN").equals("null")) {
						context.put("concentration", "Concentration d'ADN extrait : " + champs.get("tConcentrationADN") + " ng/μL");
					}
					if (champs.containsKey("t260_230") && champs.get("t260_230") != null && !champs.get("t260_230").equals("null")) {
						context.put("r260230", champs.get("t260_230"));
					} else {
						context.put("r260230", "non renseigné");
					}

					if (champs.containsKey("t260_280") && champs.get("t260_280") != null && !champs.get("t260_280").equals("null")) {
						context.put("r260280", champs.get("t260_280"));
					} else {
						context.put("r260280", "non renseigné");
					}

				}

				dateExt = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("dateExtraction", "Prel-" + prelevement.getIdPrelevement());

				try {
					if (dateExt != null) {
						context.put("dateExtraction", "Date d'extraction : " + formatter.format(formatterUS.parse(dateExt.getValeur())));
						context.put("kit", "Kit d'extraction : QIAamp DNA Blood Midi Kit de QIAGEN.");
						context.put("typePrel", "ADN extrait");
					}
				} catch (ParseException e) {
					e.printStackTrace();
				}
			}
			context.put("prelevement", prelevement);
			if (champs.containsKey("comboDemandeur-" + i)) {
				Utilisateur demandeur = UtilisateurServiceImpl.getInstance().getUtilisateurById(Integer.parseInt(champs.get("comboDemandeur-" + i)));
				context.put("demandeur", demandeur.getTitre() + " " + demandeur.getPrenom() + " " + demandeur.getNom());
			} else {
				context.put("demandeur", "non renseigné");

			}
			if (champs.containsKey("dateDemande-" + i) && champs.get("dateDemande-" + i) != null) {

				context.put("dateDemande", formatter.format(formatterUS.parse(champs.get("dateDemande-" + i))));
			} else {
				context.put("dateDemande", "non renseigné");

			}

			if (champs.containsKey("dateEnvoi-" + i) && champs.get("dateEnvoi-" + i) != null) {

				context.put("dateEnvoi", formatter.format(formatterUS.parse(champs.get("dateEnvoi-" + i))));
			} else {
				context.put("dateEnvoi", "non renseigné");

			}

			if (champs.containsKey("tVolEnvoye-" + i) && champs.get("tVolEnvoye-" + i) != null) {

				context.put("volEnvoye", champs.get("tVolEnvoye-" + i) + "μL");
			} else {
				context.put("volEnvoye", "non renseigné");

			}
			if (prelevement.getSecteur().getLibelle().contains("rénatal")) {
				Analyse ana = AnalyseServiceImpl.getInstance().getAnalyseByPersonneTypeAnalyse(personne.getIdPersonne(), 6);
				if (ana != null) {
					context.put("contamination", "Recherche de contamination maternelle sur l'ADN foetal: " + "réalisée par ségrégation des marqeurs microsatellites à l'aide du kit STR Promega " + "Powerplex® 16 HS (15 marqueurs microsatellites autosomiques, séquenceur ABI).");
				} else {
					context.put("contamination", "Recherche de contamination maternelle sur l'ADN foetal: non réalisée");
				}

			} else {
				context.put("contamination", "");
			}

			File fileout = new File(repResultat + prelevement.getNumeroPrelevement() + "_" + personne.getNom() + "_" + personne.getPrenom() + "_envoiADN_" + "_" + champs.get("dateEnvoi-" + i) + ".docx");

			fileout.setWritable(true);
			OutputStream out = new FileOutputStream(fileout);
			report.process(context, out);
			if (fileout.exists()) {
				nomFichierout += fileout.getName();
				Desktop desktop = Desktop.getDesktop();
				desktop.open(fileout);
			}

			in.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XDocReportException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return nomFichierout;
	}
}
